package com.ruijie.acl.service;

import java.util.List;
import java.util.Map;

import com.ruijie.acl.AccessGroup;
import com.ruijie.acl.AclInterface;
import com.ruijie.acl.AclInterfaceView;
import com.ruijie.acl.AclPlanInterface;
import com.ruijie.acl.task.model.AclInterfaceInfo;
import com.ruijie.emp.device.Device;
import com.ruijie.emp.device.DeviceInterface;
import com.ruijie.foundation.annotation.DomainService;
import com.ruijie.foundation.dao.support.Page;
import com.ruijie.foundation.service.Repository;

/**
 * <p>
 * Title: ACL设备接口服务接口类
 * </p>
 * <p>
 * Description: 为ACL设备接口模块提供逻辑处理，以及数据库的操作。
 * </p>
 * <p>
 * Copyright: Copyright (c) 2008
 * </p>
 * <p>
 * Company: Ruijie Co., Ltd.
 * </p>
 * <p>
 * Create Time: 2009-07-15
 * </p>
 * <p>
 * Update Time:
 * </p>
 * <p>
 * Updater:
 * </p>
 * <p>
 * Update Comments:
 * </p>
 * @author ASAI
 */
@DomainService
public interface AclInterfaceService extends Repository<AclInterface> {

	/**
	 * 分页查询
	 * 
	 * @param access 设备
	 * @param pageNo 页数
	 * @param pageSize 每页显示的记录数
	 * @return ACL接口
	 */
	public Page pageQueryByDevice(Device device, int pageNo, int pageSize);
	
	/**
	 * 根据设备获取接口信息
	 * 
	 * @param device
	 * @return List
	 */
	public List<AclInterface> getListByDevice(Device device);
	/**
	 * 根据设备和ACL组取得ACL接口视图分页信息
	 * @param device 设备
	 * @param accessGroup ACL组
	 * @param pageNo 页数
	 * @param pageSize 页尺寸
	 * @return ACL接口视图分页信息
	 */
	public Page pageQueryByDeviceAndAccessGroup(Device device, AccessGroup accessGroup, int pageNo, int pageSize);
	/**
	 * 根据设备取得设备接口
	 * 
	 * @param device
	 *            设备
	 * @return 设备接口列表
	 */
	public List<AclInterfaceView> getAclInterfaceViewByDevice(Device device) ;
	/**
	 * 根据接口ID，取得接口信息
	 * @param id 接口ID
	 * @return 接口信息
	 */
	public DeviceInterface getDeviceInterface(Long id);
	
	/**
	 * 根据ID，取得ACL组信息
	 * 用于部署时使用
	 * @param id ID
	 * @return ACL组信息
	 */
	public AccessGroup getAccessGroup(Long id);
	
	/**
	 * 根据设备取得设备接口列表
	 * @param device 设备
	 * @return 设备接口列表
	 */
	public List<DeviceInterface> getInterfaceByDevice(Device device);
	
	/**
	 * 根据设备和接口取得ACL设备
	 * @param device 设备
	 * @param deviceInterface 接口
	 * @return ACL设备
	 */
	public AclInterface getByDeviceAndInterface(Device device, DeviceInterface deviceInterface);
	
	/**
	 * 根据ACL组取得ACL接口列表
	 * @return
	 */
	public List<AclInterface> findByAccessGroup(List<AccessGroup> accessGroupList);
	
	/**
	 * 根据ACL组ID列表更新接口配置
	 * @param ids ID列表
	 */
	public void updateInterfaceByAccessGroupIds(String ids);
	
	/**
	 * 通过DeviceInterface删除AclInterfalce
	 * @param entity
	 */
	public void removeAclInterfalceByDeviceInterface(Long aclinterfaceId,Long id,String InorOut);
	
	/**
	 * 根据设备删除ACL接口
	 * @param entity 设备
	 */
	public void removeByDevice(Device entity);
	
	/**
	 * 根据id取得设备接口
	 * 
	 * @param device
	 *            设备
	 * @return 设备接口列表
	 */
	@SuppressWarnings("unchecked")
	public AclInterfaceView getAclInterfaceViewById(Long interfaceId);
	
	/**
	 * 部署ACL组到接口
	 * @param id
	 * @param device
	 */
	public void reConfig(AclInterfaceView interfaceView,Device device,String InorOut,String flag);
	
	/**
	 * 批量部署接口
	 * @param id
	 * @param device
	 */
	public void reConfigSelectInterface(Device device,List<AccessGroup> accessGroups,String selectedInterfaceByAccessGroup);
	
	/**
	 * 添加Acl Interface列表 
	 * @param aclInterfaceInfoList Acl Interface列表
	 */
	public void addAclInterfaces(List<AclInterfaceInfo> aclInterfaceInfoList,Device device);
	
	/**
	 * 通过device和accessGroup获得AclInterface
	 * @param device
	 * @param accessGroup
	 * @return
	 */
	public List<AclInterface> getAclInterfaces(Device device, AccessGroup accessGroup);
	
	/**
	 * 根据设备和组，选择出部署了此组的AclPlanInterface
	 * @param device
	 * @param accessGroup
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public List<AclPlanInterface> getAclPlanInterfaces(Device device,List<AccessGroup> accessGroups);
	
	/**
	 * 根据设备接口ID，取得ACL接口信息
	 * @param id 接口ID
	 * @return 接口信息
	 */
	public AclInterface getAclInterfaceByDeviceInterface(Long deviceInterfaceId);
	
	/**
	 * 根据设备和选择的接口，找出需要删除的接口部署信息
	 * @return 封装了in和out组的AclInterfaceInfo
	 */	
	public Map<String,AclInterfaceInfo> getAclInterfaceInfoMapByDevice(Device device,List<AclInterfaceInfo> ifInfoList);
}
